package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.Log;
import com.atguigu.jxc.service.GoodsTypeService;
import com.atguigu.jxc.service.LogService;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 杨林
 * @create 2023-01-28 11:12 星期六
 * description:
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    LogService logService;

    @Autowired
    GoodsTypeDao goodsTypeDao;

    /**
     * 查询商品类别
     * @return
     */
    @Override
    public String loadGoodsType() {

        logService.save(new Log(Log.SELECT_ACTION,"查询商品类别信息"));  //保存操作日志

        return this.getAllGoodsType(-1).toString();   //从根节点开始递归查询所有的商品类别
    }

    /**
     * 新增分类
     * @param goodsTypeName
     * @param pId
     * @return
     */
    @Override
    public ServiceVO save(String goodsTypeName, Integer pId) {
        //新增的节点按照子节点处理
        goodsTypeDao.save(goodsTypeName,pId,0);

        //然后查询当前节点的父节点，如果当前节点的父节点是叶子节点  则需要修改父节点的状态
        GoodsType parentGoodsType = goodsTypeDao.getGoodsTypeById(pId);
        Integer goodsTypeState = parentGoodsType.getGoodsTypeState();
        if (goodsTypeState == 0){
            //修改状态为1
            goodsTypeDao.updateState(pId,1);
        }

        return new ServiceVO(SuccessCode.SUCCESS_CODE,SuccessCode.SUCCESS_MESS);
    }

    /**
     * 删除分类
     * @param goodsTypeId
     * @return
     */
    @Override
    public ServiceVO delete(Integer goodsTypeId) {

        //判断要删除的节点是否有子节点  如果有子节点 则不能删除当前节点
        GoodsType goodsType = goodsTypeDao.getGoodsTypeById(goodsTypeId);
        Integer pId = goodsType.getPId();
        Integer goodsTypeState = goodsType.getGoodsTypeState();
        if (goodsTypeState == 1){
            return new ServiceVO(ErrorCode.GOODS_TYPE_ERROR_CODE,ErrorCode.GOODS_TYPE_ERROR_MESS);
        }

        //删除当前节点
        goodsTypeDao.delete(goodsTypeId);

        //当前节点删除后，如果当前节点的父节点没有子节点，则修改当前节点的父节点为叶子节点（即状态为0）
        List<GoodsType> list = goodsTypeDao.getAllGoodsTypeByParentId(pId);
        if (list.size() == 0){
            //表示当前节点没有兄弟节点
            goodsTypeDao.updateState(pId,0);
        }

        return new ServiceVO(100,"请求成功",null);
    }

    /**
     * 递归查询所有商品类别
     * @param pId
     * @return
     */
    private JsonArray getAllGoodsType(Integer pId) {
        JsonArray array = this.getAllGoodsTypeByParentId(pId);
        //遍历array中的所有节点  查询每个节点是否存在子节点（递归调用）
        for (int i = 0; i < array.size(); i++) {
            JsonObject object = (JsonObject)array.get(i);
            if (object.get("state").getAsString().equals("open")) {
                //表示当前节点是叶子节点   跳出本次循环  继续下一次
                continue;
            }else {
                //如果不是叶子节点  继续调用
                object.add("children",getAllGoodsType(object.get("id").getAsInt()));
            }
        }
        return array;
    }


    /**
     * 根据父id获取所有的子商品列表
     * @param pId
     * @return
     */
    public JsonArray getAllGoodsTypeByParentId(Integer pId){
        JsonArray array = new JsonArray();
        List<GoodsType> goodsTypeList = goodsTypeDao.getAllGoodsTypeByParentId(pId);

        //遍历goodsTypeList获取每一个节点  将每一个节点转换成一个JsonObject
        for (GoodsType goodsType : goodsTypeList) {
            JsonObject object = new JsonObject();
            object.addProperty("id",goodsType.getGoodsTypeId());
            object.addProperty("text",goodsType.getGoodsTypeName());

            //判断当前节点是否是根节点
            if (goodsType.getGoodsTypeState() == 1 ){
                //当前节点为根节点
                object.addProperty("state","closed");
            }else{
                //当前节点是叶子节点
                object.addProperty("state","open");
            }

            object.addProperty("iconCls","goods-type");  //图标默认为商品自定义的类别图标

            JsonObject attributes = new JsonObject();  //扩展属性
            attributes.addProperty("state",goodsType.getGoodsTypeState());
            object.add("attributes",attributes);

            array.add(object);
        }

        return array;
    }
}
